package org.jjj.org.service.impl;

import org.jjj.basic.constants.BaseConstants;
import org.jjj.basic.utils.ResultAjax;
import org.jjj.basic.utils.SendEmail;
import org.jjj.org.domain.Employee;
import org.jjj.org.domain.Shop;
import org.jjj.org.domain.ShopAuditLog;
import org.jjj.org.dto.AuditDTO;
import org.jjj.org.mapper.EmployeeMapper;
import org.jjj.org.mapper.ShopAuditLogMapper;
import org.jjj.org.mapper.ShopMapper;
import org.jjj.org.service.IBaiduAiService;
import org.jjj.org.service.IShopService;
import org.jjj.basic.service.impl.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.Objects;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author jiangjianjun
 * @since 2022-11-01
 */
@Service
public class ShopServiceImpl extends BaseServiceImpl<Shop> implements IShopService {
    @Autowired
    private ShopMapper shopMapper;

    @Autowired
    private EmployeeMapper employeeMapper;

    @Autowired
    private IBaiduAiService baiduAiService;

    @Autowired
    private ShopAuditLogMapper shopAuditLogMapper;

    @Autowired
    private SendEmail sendEmail;

    @Override
    @Transactional//添加事务
    public void settlement(Shop shop) throws Exception {
        //1.参数校验
        //1.1非空校验：前端必填项不能为空
        //验证店铺信息
        if (Objects.isNull(shop)){
            throw new RuntimeException("系统错误！请输入相关信息后再提交");
        }
        if(StringUtils.isEmpty(shop.getName())
           || StringUtils.isEmpty(shop.getTel())
           || StringUtils.isEmpty(shop.getAddress())){
            throw new RuntimeException("系统错误！请输入相关信息后再提交");
        }
        //验证管理员信息
        Employee admin = shop.getAdmin();
        if (Objects.isNull(admin)){
            throw new RuntimeException("系统错误！请输入相关信息后再提交");
        }
        if(StringUtils.isEmpty(admin.getUsername()) ||
           StringUtils.isEmpty(admin.getEmail()) ||
           StringUtils.isEmpty(admin.getPhone()) ||
           StringUtils.isEmpty(admin.getPassword()) ||
           StringUtils.isEmpty(admin.getConfirmPassword())){

            throw new RuntimeException("系统错误！请输入相关信息后再提交");
        }
        //1.2两次输入的密码确认
        if (!admin.getPassword().trim().equals(admin.getConfirmPassword().trim())){
            throw new RuntimeException("两次输入的密码不一致！");
        }
        //1.3店铺是否存在这里店铺状态如果是4：驳回的话是属于再次请求入住，只需修改状态和店铺信息
        //不能返回店铺已存在
        //先去用前端传过来的参数去数据库查，看店铺是否已经存在
        Shop shopByDb = shopMapper.loadByName(shop.getName());
        if (Objects.nonNull(shopByDb)){
            if (shopByDb.getState().equals(BaseConstants.Shop.STATE_REJECT_AUDIT) ){
               // 这里店铺状态如果是4：驳回的话是属于再次请求入住，只需修改状态为1待审核,然后修改数据库店铺信息
                shop.setState(BaseConstants.Shop.STATE_WAIT_AUTID);
                shop.setId(shopByDb.getId());
                //然后重置店铺信息到数据库
                shopMapper.update(shop);
            }else {
                //如果店铺状态是其他形式说明店铺已经存在
                throw new RuntimeException("该店铺已经存在！");
            }
        }else { //2.查出来的店铺信息不存在就将前端刚传入过来的店铺信息保存到数据库
            //设置注册时间为当前时间
            shop.setRegisterTime(new Date());
            //设置状态为待审核
            shop.setState(BaseConstants.Shop.STATE_WAIT_AUTID);
            //保存shop到数据库
            shopMapper.insert(shop);
        }
        //3.保存管理员信息，如果管理员名下之前就存在店铺
        //3.1方案一（采纳）：直接采用原来已有的管理员信息；
        //先根据前端传来的管理员参数去后端数据库查询是否已存在
        Employee adminByDb = employeeMapper.getByUsername(admin.getUsername());
        if (Objects.nonNull(adminByDb) && adminByDb.getPassword().equals(admin.getPassword())){
            //说明这个员工已经存在
            //这里要先判断一下看密码是否正确，不然在知道用户名的情况下会在这个管理员下恶意添加n个店铺
            //设置店铺管理员id,并更新店铺
            shop.setAdminId(adminByDb.getId());
            shopMapper.update(shop);
        }else {
            //如果不存在就保存这个管理员到员工表，返回自增主键id
            employeeMapper.insert(admin);
            //返回自增主键后重新设置店铺管理员id并更新店铺
            shop.setAdminId(admin.getId());
            shopMapper.update(shop);
        }
        // 方案二：不让入住，直接登录，让管理员去店铺管理当中自己去新增店铺，然后提交审核
        //4.审核店铺信息是否合规
        //4.1自动审核，根据审核结果修改店铺状态，并且添加审核日志
        //需要审核的内容
        String authTest = shop.getAddress()+""+shop.getName();
        //调用自动审核接口
        ResultAjax resultAjax = baiduAiService.audit(authTest, null, null);

        if (resultAjax.getSuccess()){
            //如果审核结果通过，就修改店铺状态为待激活
            shop.setState(BaseConstants.Shop.STATE_WAIT_ACTIVE);
            //审核通过就向店铺管理员发送一份激活店铺的邮件，邮件中包含激活链接
            /**
             * 发送邮件的时候：
             * 收件人取店铺管理员的邮箱
             * 主题：店铺激活
             * 内容：包含激活链接,http://localhost:80/shop/active/1  店铺的id不能写死,要获取当前要激活店铺的id
             *店铺激活的时候:要修改店铺的状态=已激活,并且要将店铺管理员的状态修改为 正常
             */
            String to = admin.getEmail();
            String subject = "店铺激活";
            String from ="2042417159@qq.com";
            //动态获取店铺id
            Long id = shop.getId();
            String text = "<a href='http://192.168.45.1:80/shop/active/"+id+"'>店铺激活</a>";//给个跳转a标签
            //发送激活邮寄给店铺管理员
            sendEmail.sendMimeMessage(from,subject,text,to);
        }else {
            //审核未通过就驳回
            shop.setState(BaseConstants.Shop.STATE_REJECT_AUDIT);
            //审核未通过就向店铺管理员发送一份邮件，说明被驳回的原因
            String to = admin.getEmail();
            String subject = "店铺未通过审核";
            String from ="2042417159@qq.com";
            String content = resultAjax.getMessage();//未通过审核原因
            sendEmail.sendSimpleEmail(from,subject,content,to);
        }
        //4.2修改完店铺状态需要重置后端数据库的店铺信息
        shopMapper.update(shop);
        //4.3添加审核日志
        //创建审核日志
        ShopAuditLog shopAuditLog = new ShopAuditLog();
        //状态为1,代表审核通过,0代表驳回
        shopAuditLog.setState(resultAjax.getSuccess()?1:0);
        //绑定审核的是哪个店铺
        shopAuditLog.setShopId(shop.getId());
        //自动审核没有审核人
        //审核时间
        shopAuditLog.setAuditTime(new Date());
        //审核信息
        shopAuditLog.setNote(resultAjax.getSuccess()?"审核已通过":"审核失败"+resultAjax.getMessage());
        //将审核日志添加到后端数据库
        shopAuditLogMapper.insert(shopAuditLog);
    }

    /**
     * 店铺激活
     * @param id
     */
    @Override
    @Transactional
    public void active(Long id) {
        //店铺激活的时候:要修改店铺的状态=已激活,并且要将店铺管理员的状态修改为 正常
        //根据店铺id查询数据库店铺信息，要获取店铺管理员的id
        Shop shop = shopMapper.selectById(id);
        shop.setState(BaseConstants.Shop.STATE_ACTIVE_SUCCESS);
        //更新店铺信息
        shopMapper.update(shop);
        //更新店铺管理员信息
        Employee admin = employeeMapper.selectById(shop.getAdminId());
        admin.setState(BaseConstants.Employee.STATE_NORMAL);
        employeeMapper.update(admin);
    }

    /**
     * 人工审核
     * @param dto
     */
    @Override
    @Transactional
    public void manualReview(AuditDTO dto) throws Exception {
//        校验前端传来的参数
        if (StringUtils.isEmpty(dto.getName())||
            StringUtils.isEmpty(dto.getAudit())||
            StringUtils.isEmpty(dto.getAuditResult())||
            StringUtils.isEmpty(dto.getNote())||
            StringUtils.isEmpty(dto.getAdmin())){

            throw new RuntimeException("系统错误！请输入相关信息后再提交");
        }
        //1.查询出要审核的店铺
        Shop shop = shopMapper.selectById(dto.getId());
        //根据id查出数据库管理员
        Employee admin = employeeMapper.selectById(dto.getAdmin().getId());
        //2.将审核结果状态更新给店铺
        Integer state = dto.getAuditResult();
        shop.setState(state);
        shopMapper.update(shop);
        //3.根据审核结果需要给店铺管理员发送一份邮件
        if (state==BaseConstants.Shop.STATE_WAIT_ACTIVE){
            //审核通过发邮件让管理员激活
            String to = "919945853@qq.com";
            String subject = "店铺激活";
            String from ="2042417159@qq.com";
            //动态获取店铺id
            Long id = shop.getId();
            String text = "<a href='http://192.168.45.1:80/shop/active/"+id+"'>店铺激活</a>";//给个跳转a标签
            //发送激活邮寄给店铺管理员
            sendEmail.sendMimeMessage(from,subject,text,to);
        }else {
            //审核未通过就向店铺管理员发送一份邮件，说明被驳回的原因
            String to = "919945853@qq.com";
            String subject = "店铺未通过审核";
            String from ="2042417159@qq.com";
            String content = dto.getNote();//未通过审核原因
            sendEmail.sendSimpleEmail(from,subject,content,to);
        }
        //4.更新数据库店铺审核日志
        //创建审核日志
        ShopAuditLog shopAuditLog = new ShopAuditLog();
        //状态为1,代表审核通过,0代表驳回
        shopAuditLog.setState(state==BaseConstants.Shop.STATE_WAIT_ACTIVE?1:0);
        //绑定审核的是哪个店铺
        shopAuditLog.setShopId(shop.getId());
        //审核人
        shopAuditLog.setAuditId(dto.getAudit().getId());
        //审核时间
        shopAuditLog.setAuditTime(new Date());
        //审核信息
        shopAuditLog.setNote(dto.getNote());
        //将审核日志添加到后端数据库
        shopAuditLogMapper.insert(shopAuditLog);

    }
}
